/**
 * 题目三:
 * 基于下面提供的代码(q3/support.js), 完成后续的四个练习
 */

const fp = require('lodash/fp');
const { Maybe, Container } = require('./q3/support');

let maybe = Maybe.of([5, 6, 1]);
console.info(
  '练习1: 使用 fp.add(x,y) 和 fp.map(f, x) 创建一个能让 functor 里的值增加的函数 ex1'
);
let ex1 = fp.map(fp.add(1));
console.info(maybe.map(ex1));

let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do']);
console.info(
  '练习2: 实现一个函数 ex2, 能够使用 fp.first 获取列表中的第一个元素'
);
let ex2 = fp.first;
console.info(xs.map(fp.first));
// 这是脑筋急转弯吗, 如果 ex2 作为 map 的入参, 怎样才能让 fp.first 得到 funtor 的值?

let user = { id: 2, name: 'Albert' };
let safeProp = fp.curry(function (x, o) {
  return Maybe.of(o[x]);
});
console.info(
  '练习3: 实现一个函数 ex3, 使用 safeProp 和 fp.first 找到 user 的名字的首字母'
);
const ex3 = (v) => safeProp('name')(v).map(fp.first);
console.info(ex3(user));

/**
 * 练习4:
 * 使用 Maybe 重写 ex4, 不要有 if 语句
 * let ex4 = function(n) {
 *   if(n) { return parseInt(n); }
 * }
 */
console.info('使用 Maybe 重写 ex4, 不要有 if 语句');
let ex4 = function (n) {
  return Maybe.of(n).map(parseInt)._value;
};
console.info(ex4('2'));
